package com.clx.myserecurity.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.clx.myserecurity.domain.Users;
import com.clx.myserecurity.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

/**
 * QueryWrapper<Users>:
 * 创建一个查询条件构造器，专门用于Users实体类
 * <Users>表示这个查询构造器针对的是Users类型
 * new QueryWrapper<Users>():
 * 实例化一个新的查询构造器对象
 * .eq("username", username):
 * eq表示"equal"（等于）
 * "username"是数据库表中的字段名
 * username是方法参数，即用户输入的用户名
 * 整体构造的条件是：username = '用户输入的值'
 * 这行代码创建了一个查询条件，相当于SQL语句：
 * WHERE username = '具体的用户名值'
 * 1,2相当于下面的这个查询条件
 * 当这个wrapper被传递给userMapper.selectByOne(wrapper)时，会执行类似：
 * SELECT * FROM users WHERE username = '具体的用户名值'
 * */

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserMapper userMapper;
    // 自定义认证逻辑
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 1.够造查询条件，QueryWrapper构造查询器
        QueryWrapper<Users> wrapper = new QueryWrapper<Users>().eq("username",username);
        // 2,查询用户，selectOne方法返回一条记录
        Users users = userMapper.selectOne(wrapper);
        // 3,封装为 UserDetails对象，UserDetails用户认证的相关信息，如：用户名，密码，角色等等
        UserDetails userDetails = User.withUsername(users.getUsername())
                .password(users.getPassword())
                .roles("admin")
                .build();
        // 4，返回封装好的UserDetails对象
        System.out.println(userDetails);
        return userDetails;
    }
}
